// 导入依赖包
import koa from "koa";
import Router from "koa-router";
import bodyParser from "koa-bodyparser";
import cors from "@koa/cors";
import { DataTypes, Sequelize, Op, STRING, DOUBLE, FLOAT, where } from "sequelize";

// 创建 koa 实例
const app = new koa();

// 创建 sequelize 实例
const sequelize = new Sequelize('test', 'root', '123456', {
    dialect: "mysql",
})

// 定义模型
const Book = sequelize.define('books', {
    // 图书名称
    bookName: {
        type: STRING
    },
    // 作者
    autor: {
        type: STRING
    },
    // 价格
    price: {
        type: FLOAT(2)
    },
})

// 同步模型
// sequelize.sync();

// 插入数据
// Book.create({
//     // 图书名称
//     bookName: "西游记2",
//     // 作者
//     autor: "吴承恩",
//     // 价格
//     price: 18.00
// })

// 解决跨域问题
app.use(cors());

// 请求体解析
app.use(bodyParser());

// 创建路由实例
const router = new Router()

/** 路由方法 */
// 查询所有图书
router.get('/books', async (ctx, next) => {
    // 获取关键词
    const keyWord = ctx.query.keyWord;

    // 查询条件
    let where;

    // 判断是否使用模糊查询
    if (keyWord) {
        where = {
            [Op.or]: {
                bookName: {
                    [Op.like]: `%${keyWord}%`
                },
                autor: {
                    [Op.like]: `%${keyWord}%`
                },
                price: {
                    [Op.eq]: keyWord
                }
            }
        }
    }
    else {
        where = null;
    }

    // 查询所有图书
    const books = await Book.findAll({ where })

    // 成功状态码
    ctx.status = 200;

    // 响应数据
    ctx.body = {
        code: 200,
        data: books,
        msg: "查询成功"
    }
})

// 查询一本图书
router.get('/books/:id', async (ctx, next) => {
    // 获取 id
    const id = ctx.params.id;

    // 查询所有图书
    const book = await Book.findByPk(id);

    // 成功状态码
    ctx.status = 200;

    // 响应数据
    ctx.body = {
        code: 200,
        data: book,
        msg: "查询成功"
    }
})

// 新增图书
router.post('/books', async (ctx, next) => {
    // 获取新增对象
    const obj = ctx.request.body;

    // 新增图书
    await Book.create(obj);

    // 成功状态码
    ctx.status = 200;

    // 响应数据
    ctx.body = {
        code: 200,
        data: null,
        msg: "新增成功"
    }
})

// 修改图书
router.put('/books/:id', async (ctx, next) => {
    // 获取新增对象
    const obj = ctx.request.body;

    // 获取 id
    const id = ctx.params.id;

    // 新增图书
    await Book.update(obj, { where: { id } });

    // 成功状态码
    ctx.status = 200;

    // 响应数据
    ctx.body = {
        code: 200,
        data: null,
        msg: "修改成功"
    }
})

// 删除图书
router.delete('/books/:id', async (ctx, next) => {
    // 获取 id
    const id = ctx.params.id;

    // 删除图书
    await Book.destroy({ where: { id } });

    // 成功状态码
    ctx.status = 200;

    // 响应数据
    ctx.body = {
        code: 200,
        data: null,
        msg: "删除成功"
    }
})

// 注册路由
app.use(router.routes())

// 服务器端口
const appPort = 8000;

// 监听端口
app.listen(appPort);

console.log(`当前服务运行在：http://localhost:${appPort}`);

